/*!
 * \file WtMinImpactExeUnit.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 *
 * \brief 最小冲击执行单元
 * \details 实现最小市场冲击的执行算法，通过智能下单策略减少对市场的冲击
 */
#pragma once
#include "../Includes/ExecuteDefs.h"
#include "WtOrdMon.h"

USING_NS_WTP;

/**
 * @class WtMinImpactExeUnit
 * @brief 最小冲击执行单元类
 * @details 继承自ExecuteUnit，实现最小市场冲击的执行算法
 *          通过分批下单、价格跟踪等策略来减少大单对市场的冲击
 *          支持多种价格模式和风险控制参数
 */
class WtMinImpactExeUnit : public ExecuteUnit
{
public:
	/**
	 * @brief 构造函数
	 */
	WtMinImpactExeUnit();
	
	/**
	 * @brief 析构函数
	 */
	virtual ~WtMinImpactExeUnit();

private:
	/**
	 * @brief 执行计算逻辑
	 * @details 根据当前市场状况和目标仓位计算下单策略
	 */
	void	do_calc();

public:
	/**
	 * @brief 获取执行工厂名称
	 * @return 返回所属执行工厂的名称
	 */
	virtual const char* getFactName() override;

	/**
	 * @brief 获取执行单元名称
	 * @return 返回执行单元的名称
	 */
	virtual const char* getName() override;

	/**
	 * @brief 初始化执行单元
	 * @param ctx 执行单元上下文环境
	 * @param stdCode 标准化的合约代码
	 * @param cfg 配置参数
	 */
	virtual void init(ExecuteContext* ctx, const char* stdCode, WTSVariant* cfg) override;

	/**
	 * @brief 订单回报处理
	 * @param localid 本地订单号
	 * @param stdCode 合约代码
	 * @param isBuy 买入或卖出标志
	 * @param leftover 剩余数量
	 * @param price 委托价格
	 * @param isCanceled 是否已撤销
	 */
	virtual void on_order(uint32_t localid, const char* stdCode, bool isBuy, double leftover, double price, bool isCanceled) override;

	/**
	 * @brief tick数据回调处理
	 * @param newTick 最新的tick数据
	 */
	virtual void on_tick(WTSTickData* newTick) override;

	/**
	 * @brief 成交回报处理
	 * @param localid 本地订单号
	 * @param stdCode 合约代码
	 * @param isBuy 买入或卖出标志
	 * @param vol 成交数量，这里没有正负，通过isBuy确定是买入还是卖出
	 * @param price 成交价格
	 */
	virtual void on_trade(uint32_t localid, const char* stdCode, bool isBuy, double vol, double price) override;

	/**
	 * @brief 新订单委托回报处理
	 * @param localid 本地订单号
	 * @param stdCode 合约代码
	 * @param bSuccess 委托是否成功
	 * @param message 回报消息
	 */
	virtual void on_entrust(uint32_t localid, const char* stdCode, bool bSuccess, const char* message) override;

	/**
	 * @brief 设置新的目标仓位
	 * @param stdCode 合约代码
	 * @param newVol 新的目标仓位
	 */
	virtual void set_position(const char* stdCode, double newVol) override;

	/**
	 * @brief 清理全部仓位
	 * @param stdCode 合约代码
	 */
	virtual void clear_all_position(const char* stdCode) override;

	/**
	 * @brief 交易通道就绪回调
	 */
	virtual void on_channel_ready() override;

	/**
	 * @brief 交易通道丢失回调
	 */
	virtual void on_channel_lost() override;

private:
	WTSTickData* _last_tick;	///< 最后一笔行情数据
	double		_target_pos;	///< 目标仓位
	StdUniqueMutex	_mtx_calc;	///< 计算互斥锁

	WTSCommodityInfo*	_comm_info;	///< 品种信息
	WTSSessionInfo*		_sess_info;	///< 交易时段信息

	//////////////////////////////////////////////////////////////////////////
	// 执行参数
	int32_t		_price_offset;	///< 价格偏移量，用于调整下单价格
	uint32_t	_expire_secs;	///< 订单过期时间（秒）
	int32_t		_price_mode;	///< 价格模式：0-最新价，1-对手价，2-排队价
	uint32_t	_entrust_span;	///< 委托间隔时间（毫秒）
	bool		_by_rate;		///< 是否按比例下单
	double		_order_lots;	///< 单次下单手数
	double		_qty_rate;		///< 数量比例

	WtOrdMon	_orders_mon;	///< 订单监控器
	uint32_t	_cancel_cnt;	///< 撤单次数统计
	uint32_t	_cancel_times;	///< 允许的最大撤单次数

	uint64_t	_last_place_time;	///< 最后下单时间
	uint64_t	_last_tick_time;	///< 最后tick时间
};

